import pandas as pd
from typing import Tuple
from seleniu.tool import is_sn_valid


def process_device_sn_data(
        input_excel_path: str = "售后卡顿机器分析.xlsx",
        filter_file: str = "学习机.xlsx",
        output_processed_file: str = "机器处理.txt",
        output_passed_file: str = "不处理.txt",
        exit_command: str = "exit",
        sheet_name: str = '学习机售后机器'
) -> Tuple[int, int]:
    """
    处理设备SN号数据，进行分类并写入相应文件

    参数:
        input_excel_path (str): 主数据Excel文件路径，默认"售后卡顿机器分析.xlsx"
        sheet_name (str): 主数据Excel的工作表名，默认'墨水屏售后机器'
        filter_file (str): 筛选条件Excel文件路径，默认"学习机.xlsx"
        output_processed_file (str): 需要处理的设备输出文件路径，默认"机器处理.txt"
        output_passed_file (str): 不需处理的设备输出文件路径，默认"不处理.txt"
        exit_command (str): 退出交互模式的命令，默认"exit"

    返回:
        Tuple[int, int]: 处理设备数量和通过设备数量

    功能说明:
        1. 读取两个Excel文件中的SN号数据
        2. 交互式输入SN号进行检查
        3. 将需要处理的SN号写入处理文件
        4. 将不需处理的SN号写入通过文件
        5. 提供实时计数和状态反馈
    """
    try:
        # 读取数据文件
        main_data = pd.read_excel(input_excel_path, sheet_name=sheet_name)
        filter_data = pd.read_excel(filter_file)

        # 获取SN号列表并转换为字符串
        process_sn_list = filter_data['SN号'].astype(str).str.strip().tolist()
        total_sn_list = main_data['SN号'].astype(str).str.strip().tolist()

    except FileNotFoundError as e:
        raise FileNotFoundError(f"Excel文件未找到: {e.filename}")  from e
    except Exception as e:
        raise RuntimeError(f"读取Excel文件时发生错误: {str(e)}") from e

    processed_count = 0
    passed_count = 0
    checked_sn_list = []

    try:
        with (
            open(output_processed_file, 'w', encoding='utf-8') as processed_file,
            open(output_passed_file, 'w', encoding='utf-8') as passed_file
        ):
            print("\n" + "=" * 40)
            print("设备SN号处理系统")
            print(f"输入 '{exit_command}' 可退出程序")
            print("=" * 40 + "\n")

            while True:
                input_sn = input("请输入SN号: ").strip()

                # 退出条件
                if input_sn.lower() == exit_command.lower():
                    print("\n正在退出程序...")
                    break

                # SN号有效性检查
                if not is_sn_valid(input_sn):
                    print(f"⚠️ {input_sn} 不符合SN号格式要求，请重新输入")
                    continue

                # 重复输入检查
                if input_sn in checked_sn_list:
                    print(f"⚠️ {input_sn} 已处理过，请勿重复输入")
                    continue

                # 设备存在性检查
                if input_sn not in total_sn_list:
                    print(f"⚠️ {input_sn} 不在主数据列表中，请检查")
                    continue

                # 添加到已检查列表
                checked_sn_list.append(input_sn)

                # 分类处理
                if input_sn in process_sn_list:
                    processed_file.write(f"{input_sn}\n")
                    processed_count += 1
                    print(f"✅ [{processed_count}] {input_sn} → 需要处理")
                else:
                    passed_file.write(f"{input_sn}\n")
                    passed_count += 1
                    print(f"☑️ [{passed_count}] {input_sn} → 不需处理")

    except IOError as e:
        raise IOError(f"写入输出文件时出错: {str(e)}") from e

    return processed_count, passed_count


if __name__ == "__main__":
    from analy import filter_machine_data
    try:
        input_excel = "售后卡顿机器分析.xlsx"  # 输入文件路径
        # sheet_name = "墨水屏售后机器"
        output_excel = "学习机.xlsx"  # 输出文件路径
        filter_machine_data(input_file = input_excel,output_file = output_excel)
        processed, passed = process_device_sn_data(input_excel_path= input_excel,filter_file=output_excel)
        print("\n" + "=" * 40)
        print(f"处理完成: 需要处理设备 {processed} 台 | 不需处理设备 {passed} 台")
        print("=" * 40)
    except Exception as e:
        print(f"\n❌ 程序运行出错: {str(e)}")
        exit(1)